/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.javahispano.javacup.tacticas.tacticas_aceptadas.Sag;

import java.util.Random;
import org.javahispano.javacup.modelo.comando.Comando;
import org.javahispano.javacup.modelo.comando.ComandoGolpearBalon;
import org.javahispano.javacup.modelo.comando.ComandoIrA;
import org.javahispano.javacup.modelo.util.Constantes;
import org.javahispano.javacup.modelo.JugadorDetalle;
import org.javahispano.javacup.modelo.util.Posicion;
import org.javahispano.javacup.modelo.engine.SituacionPartido;

/**
 *
 * @author pdsanchez
 */
public class Portero extends Jugador {
    private Random rnd = new Random();

    public Portero(int idx, JugadorDetalle detalle, Posicion posRef) {
        super(idx, detalle, posRef);
        this.setTipo(Jugador.TIPO_PORTERO);
    }

    public Portero(int idx, JugadorDetalle detalle) {
        super(idx, detalle);
        this.setTipo(Jugador.TIPO_PORTERO);
    }

    @Override
    public Comando irAPosicionDestino() {
        // Si el portero sale de su zona vuelve a la pos de ref
        if (sp.sacaRival() ||
                sp.saco() ||
                Math.abs(this.getPosicionActual().getX()) > Constantes.ANCHO_CAMPO_JUEGO / 8 ||
                Math.abs(this.getPosicionActual().getY()) < Constantes.penalSup.getY()) {
            this.setPosicionDestino(this.getPosicionReferencia());
        }
        else {
            // El portero oscila hacia la pelota si el balon esta en mi campo
            if (!this.estaBalonEnCampoRival()) {
                double x = (this.getPosicionBalon().getX() * (Constantes.LARGO_ARCO / 2) - 0.5) / (Constantes.ANCHO_CAMPO_JUEGO / 2);
                this.setPosicionDestino(this.getPosicionReferencia().getX() + x, this.getPosicionReferencia().getY());
            }
            else {
                this.setPosicionDestino(this.getPosicionReferencia());
            }
        }
        return new ComandoIrA(this.getIndice(), this.getPosicionDestino());
    }

    @Override
    public Comando GolpearBalon() {
        // Distancia del rival mas cercano a este jugador
        double dist = this.getPosicionActual().distancia(this.getRivalMasCercano().getPosicionActual());

        // Si la distancia es peq patadon a central
        if (!sp.saco() || dist < 5) {
            int idx = rnd.nextInt(11);
            do {
               idx = rnd.nextInt(11);
            } while (!jugadores[idx].isCentral());
            return new ComandoGolpearBalon(this.getIndice(), jugadores[idx].getPosicionActual(), 1, true);
        }
        else {
            Comando c = this.paseAdelantado();
            if (c != null) {
                return c;
            }

            // No hay pase => DESMARCAR CENTRALES
//            int idx = rnd.nextInt(11);
//            do {
//               idx = rnd.nextInt(11);
//            } while (!jugadores[idx].isCentral());
//            return new ComandoGolpearBalon(this.getIndice(), jugadores[idx].getPosicionActual(), 1, Constantes.ANGULO_VERTICAL_MAX);

            if (rnd.nextBoolean()) {
                return new ComandoGolpearBalon(this.getIndice(), Constantes.centroCampoJuego, .8 + Math.random() * .2, true);
            }
            else if (rnd.nextBoolean()) {
                return new ComandoGolpearBalon(this.getIndice(), Constantes.cornerSupIzq, .8 + Math.random() * .2, true);
            }
            else {
                return new ComandoGolpearBalon(this.getIndice(), Constantes.cornerSupDer, .8 + Math.random() * .2, true);
            }
            
        }
    }

    private Comando paseAdelantado() {
        Jugador ppal = null;
        double diffPpal = -1;
        double distPpal = -1;
        Jugador sec = null;
        double diffSec = -1;
        double distSec = -1;

        //obtiene los jugadores mas cercanos, al jugador que puede rematar
        Jugador[] cercanos = this.getCompanerosCercanos();
        for (Jugador j : cercanos) {
            // El jugador que recibe esta mas adelantado
            if (j.isDefensa() || j.isCentral() &&
                    this.getPosicionActual().getY() < j.getPosicionActual().getY()) {
                double dist = this.getPosicionActual().distancia(j.getPosicionActual());
                // Distancia del rival mas cercano a este jugador
                double distRival = j.getPosicionActual().distancia(j.getRivalMasCercano().getPosicionActual());

                if (!j.existeMarcaje()) {
                    double diff = distRival - dist;
                    if (diff > 0 && diff > diffPpal) {
                        ppal = j;
                        diffPpal = diff;
                        distPpal = dist;
                    } else {
                        diff = distRival - dist / 3;
                        if (diff > 0 && diff > diffSec) {
                            sec = j;
                            diffSec = diff;
                            distSec = dist;
                        }
                    }
                }
            }
        }
        Jugador j = null;
        j = (ppal != null) ? ppal : (sec != null) ? sec : null;
        double dist = (ppal != null) ? distPpal : (sec != null) ? distSec : -1;
        if (j != null) {
            double fuerza = 0.6;
            boolean alto = false;
            if (dist > 17) {
                alto = true;
                fuerza = 0.8;
            }
            return new ComandoGolpearBalon(this.getIndice(), j.getPosicionActual(), fuerza + Math.random() * (1 - fuerza), alto);
        }
        return null;
    }
}
